﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL.Reports;
using System.Data.Objects;
using FrameworkLib.Facades;

namespace GestionePolveriLib.Facades.Reports
{
    public class Report525Facade : FacadeBase<GestionePolveriEntities>
    {
        Filter525 m_filter = null;

        public Report525Facade()
        {

        }

        public Report525Facade(Filter525 filter)
        {
            m_filter = filter;
        }

        public List<Report525> GetReport525Data()
        {
            List<Report525> retValue = null;

            if (m_filter.Polvere == -1)
            {
                retValue = GetReport525DataXXX();
            }
            else
            {
                retValue = GetReport525DataXXX_2();
            }

            return retValue;
        }

        public List<Report525> GetReport525DataXXX()
        {
            List<Report525> retValue = null;
            int[] m_impiantiSelezionati = m_filter.Impianti;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.Movimenti
                      where x.CausaliMagazzino.CodCausale == "S"
                            && ((x.DataMovimento >= m_filter.PeriodFrom) && (x.DataMovimento <= m_filter.PeriodTo))
                            && m_impiantiSelezionati.Contains((int)x.IDImpianto)
                      group x by new { data = EntityFunctions.TruncateTime(x.DataMovimento), x.IDPolvere, x.AnagPolveri.CodicePolvere, x.Impianti.Impianto } into g
                      select new Report525
                      {
                          DataScarico = g.Key.data,
                          CodicePolvere = g.Key.CodicePolvere,
                          NumeroScarichi = g.Count(),
                          Impianto = g.Key.Impianto,
                          DatiAbbinati = (from cc1 in context.ComposizioneColori
                                          where cc1.AnagPolveri.CodicePolvere == g.Key.CodicePolvere
                                          select new Dati_Associati
                                          {
                                              ColoriAbbinati = cc1.AnagColori.CodiceColore + ", ",
                                              Famiglia = cc1.AnagColori.AnagFamiglie.Descrizione + ", "
                                          })
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<Report525> GetReport525DataXXX_2()
        {
            List<Report525> retValue = null;
            int[] m_impiantiSelezionati = m_filter.Impianti;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.Movimenti
                      where x.CausaliMagazzino.CodCausale == "S"
                            && ((x.DataMovimento >= m_filter.PeriodFrom) && (x.DataMovimento <= m_filter.PeriodTo))
                            && m_impiantiSelezionati.Contains((int)x.IDImpianto)
                            && x.IDPolvere == m_filter.Polvere
                      group x by new { data = EntityFunctions.TruncateTime(x.DataMovimento), x.IDPolvere, x.AnagPolveri.CodicePolvere, x.Impianti.Impianto } into g
                      select new Report525
                      {
                          DataScarico = g.Key.data,
                          CodicePolvere = g.Key.CodicePolvere,
                          NumeroScarichi = g.Count(),
                          Impianto = g.Key.Impianto,
                          DatiAbbinati = (from cc1 in context.ComposizioneColori
                                          where cc1.AnagPolveri.CodicePolvere == g.Key.CodicePolvere
                                          select new Dati_Associati
                                          {
                                              ColoriAbbinati = cc1.AnagColori.CodiceColore + ", ",
                                              Famiglia = cc1.AnagColori.AnagFamiglie.Descrizione + ", "
                                          })
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        /*
        public List<Report525> GetReport525Data0()
        {
            List<Report525> retValue = null;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.Movimenti
                      join y in context.CausaliMagazzino on x.IDCausale equals y.IDCausale
                      where y.CodCausale == "S" &&
                            ((x.DataMovimento >= m_filter.PeriodFrom) && (x.DataMovimento <= m_filter.PeriodTo))
                      group x by new { data = EntityFunctions.TruncateTime(x.DataMovimento), x.IDPolvere, x.AnagPolveri.CodicePolvere } into g
                      select new Report525
                      {
                          DataScarico = g.Key.data,
                          CodicePolvere = g.Key.CodicePolvere,
                          NumeroScarichi = g.Count()
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<Report525> GetReport525Data1()
        {
            List<Report525> retValue = null;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.Movimenti
                      join y in context.CausaliMagazzino on x.IDCausale equals y.IDCausale
                      where y.CodCausale == "S" &&
                            ((x.DataMovimento >= m_filter.PeriodFrom) && (x.DataMovimento <= m_filter.PeriodTo)) &&
                            x.IDImpianto == m_filter.Impianto
                      group x by new { data = EntityFunctions.TruncateTime(x.DataMovimento), x.IDPolvere, x.AnagPolveri.CodicePolvere } into g
                      select new Report525
                      {
                          DataScarico = g.Key.data,
                          CodicePolvere = g.Key.CodicePolvere,
                          NumeroScarichi = g.Count()
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<Report525> GetReport525Data2()
        {
            List<Report525> retValue = null;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.Movimenti
                      join y in context.CausaliMagazzino on x.IDCausale equals y.IDCausale
                      where y.CodCausale == "S" &&
                            ((x.DataMovimento >= m_filter.PeriodFrom) && (x.DataMovimento <= m_filter.PeriodTo)) &&
                            x.IDPolvere == m_filter.Polvere
                      group x by new { data = EntityFunctions.TruncateTime(x.DataMovimento), x.IDPolvere, x.AnagPolveri.CodicePolvere } into g
                      select new Report525
                      {
                          DataScarico = g.Key.data,
                          CodicePolvere = g.Key.CodicePolvere,
                          NumeroScarichi = g.Count()
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public string GetColoriAssociati(string codicePolvere)
        {
            string retValue = null;

            try
            {
                GestionePolveriEntities context = this.GetContext();
                var obj = (from x in context.ComposizioneColori
                           where x.AnagPolveri.CodicePolvere == codicePolvere
                           select (x.AnagColori.CodiceColore + ", ")).Distinct();

                if (obj.Any())
                {
                    obj.ToList().ForEach(x => retValue += x);

                    int i = retValue.LastIndexOf(",");

                    retValue = retValue.Substring(0, i);
                }

            }
            catch (Exception ex)
            {
            }

            return retValue;
        }
         */
    }
}
